﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.Codigo;
using System.Data;
using SIIE_ERP.Codigo.Configuracion;
using SIIE_ERP.BaseDatos.Inventarios.Catalogos;
using SIIE_ERP.BaseDatos.Bancos.Catalogos;

namespace Elysium.Demo.Configuracion
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class CargaDatos_Articulo3 : UserControl
    {
        private UsuarioActivo _sesion;
        private List<CargaDatos_Articulo> _datos = new List<CargaDatos_Articulo>();

        public CargaDatos_Articulo3(ref UsuarioActivo usuario, ref DataTable Datos)
        {
            InitializeComponent();
            this._sesion = usuario;            

            for (int i = 0; i < Datos.Rows.Count; i++)
            {
                CargaDatos_Articulo AuxCarga = new CargaDatos_Articulo();
                AuxCarga.ArticuloDescontinuado = Datos.Rows[i]["ArticuloDescontinuado"].ToString();
                AuxCarga.ArticuloDisponibleVenta = Datos.Rows[i]["ArticuloDisponibleVenta"].ToString();
                AuxCarga.ClaveArticulo = Datos.Rows[i]["ClaveArticulo"].ToString();
                AuxCarga.CodigoBarrasArticulo = Datos.Rows[i]["CodigoBarrasArticulo"].ToString();
                AuxCarga.ColorArticulo = Datos.Rows[i]["ColorArticulo"].ToString();
                AuxCarga.CostoEstandarArticulo = Double.Parse(Datos.Rows[i]["CostoEstandarArticulo"].ToString());
                AuxCarga.DescripcionArticulo = Datos.Rows[i]["DescripcionArticulo"].ToString();
                AuxCarga.GrupoProdArticulo = Datos.Rows[i]["GrupoProdArticulo"].ToString();
                AuxCarga.IsValid = Boolean.Parse(Datos.Rows[i]["IsValid"].ToString());
                AuxCarga.LineaProdArticulo = Datos.Rows[i]["LineaProdArticulo"].ToString();
                AuxCarga.MarcarArticulo = Datos.Rows[i]["MarcarArticulo"].ToString();
                AuxCarga.MonedaArticulo = Datos.Rows[i]["MonedaArticulo"].ToString();
                AuxCarga.NombreArticulo = Datos.Rows[i]["NombreArticulo"].ToString();
                AuxCarga.PrecioListaArticulo = Double.Parse(Datos.Rows[i]["PrecioListaArticulo"].ToString());
                AuxCarga.PrecioMinArticulo = Double.Parse(Datos.Rows[i]["PrecioMinArticulo"].ToString());
                AuxCarga.ProductoServicio = Datos.Rows[i]["ProductoServicio"].ToString();                
                AuxCarga.SubGrupoProdArticulo = Datos.Rows[i]["SubGrupoProdArticulo"].ToString();
                AuxCarga.TallaArticulo = Datos.Rows[i]["TallaArticulo"].ToString();
                AuxCarga.TasaImpuestoArticulo = Double.Parse(Datos.Rows[i]["TasaImpuestoArticulo"].ToString());
                AuxCarga.UM_Articulo = Datos.Rows[i]["UM_Articulo"].ToString();

                if (AuxCarga.IsValid)
                    _datos.Add(AuxCarga);

                DatosDataGrid.Items.Add(AuxCarga);
            }
        }

        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("CargaDatos.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        private void ButtonRegresar_Click_1(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Se ha cancelado la carga del Excel.");
            ((ScrollViewer)this.Parent).Content = new CargaDatos_Main(ref _sesion);
        }

        private void Button_Agregar_Click_1(object sender, RoutedEventArgs e)
        {
            dbo_Cat_Grupo_Productos Cat_Grupo_Productos = new dbo_Cat_Grupo_Productos(_sesion.RFC, _sesion.UserName);
            dbo_Cat_SubGrupo_Productos Cat_SubGrupo_Productos = new dbo_Cat_SubGrupo_Productos(_sesion.RFC, _sesion.UserName);
            dbo_Cat_Linea Cat_Linea = new dbo_Cat_Linea(_sesion.RFC, _sesion.UserName);
            dbo_Cat_Color Cat_Color = new dbo_Cat_Color(_sesion.RFC, _sesion.UserName);
            dbo_Cat_Talla Cat_Talla = new dbo_Cat_Talla(_sesion.RFC, _sesion.UserName);
            dbo_Cat_UM Cat_UM = new dbo_Cat_UM(_sesion.RFC, _sesion.UserName);
            dbo_Cat_TasaImpuesto Cat_TasaImpuesto = new dbo_Cat_TasaImpuesto(_sesion.RFC, _sesion.UserName);
            dbo_Cat_Articulo Cat_Articulo = new dbo_Cat_Articulo(_sesion.RFC, _sesion.UserName);
            dbo_Cat_Moneda Cat_Moneda = new dbo_Cat_Moneda(_sesion.RFC, _sesion.UserName);

            var dt_Cat_Grupo_Productos = Cat_Grupo_Productos.Get_Grupo_Productoses().AsEnumerable();
            var dt_Cat_SubGrupo_Productos = Cat_SubGrupo_Productos.Get_Subgrupo_Productoses().AsEnumerable();
            var dt_Cat_Linea = Cat_Linea.Get_Lineaes().AsEnumerable();
            var dt_Cat_Color = Cat_Color.Get_Colores().AsEnumerable();
            var dt_Cat_Talla = Cat_Talla.Get_Tallas().AsEnumerable();
            var dt_Cat_UM = Cat_UM.Get_UMes().AsEnumerable();
            var dt_Cat_TasaImpuesto = Cat_TasaImpuesto.Get_TasaImpuestoes().AsEnumerable();
            var dt_Cat_Moneda = Cat_Moneda.Get_Monedas().AsEnumerable();

            //Agregamos Grupos de Productos
            var query_1 =    
                (from c in _datos
                where !(from o in dt_Cat_Grupo_Productos
                        select o.Field<string>("Nombre"))    
                       .Contains(c.GrupoProdArticulo)
                 select c)
                .GroupBy(p => p.GrupoProdArticulo)
                .Select(g => g.First());

            foreach (var c in query_1) {
                Cat_Grupo_Productos.Insert_Grupo_Productos(c.GrupoProdArticulo, c.GrupoProdArticulo);
            }
            
            dt_Cat_Grupo_Productos = Cat_Grupo_Productos.Get_Grupo_Productoses().AsEnumerable();

            //Agregamos SubGrupos de Productos
            var query_2 =
                (from c in _datos
                 where !
                     (
                         (from o in dt_Cat_SubGrupo_Productos
                          select o.Field<string>("Desc_GrupoProductos"))
                             .Contains(c.GrupoProdArticulo)
                        &&

                         (from o in dt_Cat_SubGrupo_Productos
                          select o.Field<string>("Nombre"))
                             .Contains(c.SubGrupoProdArticulo)
                        )
                 select c)
                .GroupBy(p => new { p.GrupoProdArticulo, p.SubGrupoProdArticulo })
                .Select(g => g.First());

            foreach (var c in query_2)
            {
                Cat_SubGrupo_Productos.Insert_Subgrupo_Productos
                (
                    c.SubGrupoProdArticulo,
                    Int32.Parse(Cat_Grupo_Productos.Get_Grupo_Productos_Por_Nombre(c.GrupoProdArticulo).Rows[0]["Id_GrupoProductos"].ToString())
                );
            }
            dt_Cat_SubGrupo_Productos = Cat_SubGrupo_Productos.Get_Subgrupo_Productoses().AsEnumerable();

            //Agregamos Lineas
            var query_3 =
                (from c in _datos
                 where !(from o in dt_Cat_Linea
                         select o.Field<string>("Nombre"))
                        .Contains(c.LineaProdArticulo)
                 select c)
                .GroupBy(p => p.LineaProdArticulo)
                .Select(g => g.First());                

            foreach (var c in query_3)
            {
                Cat_Linea.Insert_Linea(c.LineaProdArticulo, "000");
            }

            dt_Cat_Linea = Cat_Linea.Get_Lineaes().AsEnumerable();

            //Agregamos Tallas
            var query_4 =
                (from c in _datos
                where !
                    (
                        (from o in dt_Cat_Talla
                         select o.Field<string>("Desc_Linea"))
                            .Contains(c.LineaProdArticulo)
                       &&

                        (from o in dt_Cat_Talla
                         select o.Field<string>("Nombre"))
                            .Contains(c.TallaArticulo)
                       )
                 select c)
                .GroupBy(p => new { p.LineaProdArticulo, p.TallaArticulo })
                .Select(g => g.First());

            foreach (var c in query_4)
            {
                Cat_Talla.Insert_Talla
                (
                    Int32.Parse(Cat_Linea.Get_Linea_Por_Nombre(c.LineaProdArticulo).Rows[0]["Id_Linea"].ToString()),
                    c.TallaArticulo,
                    "000"                    
                );
            }
            dt_Cat_Talla = Cat_Talla.Get_Tallas().AsEnumerable();

            //Agregamos Colores
            var query_5 =
                (from c in _datos
                where !
                    (
                        (from o in dt_Cat_Color
                         select o.Field<string>("Desc_Linea"))
                            .Contains(c.LineaProdArticulo)
                       &&

                        (from o in dt_Cat_Color
                         select o.Field<string>("Nombre"))
                            .Contains(c.ColorArticulo)
                       )
                 select c)
                .GroupBy(p => new { p.LineaProdArticulo, p.ColorArticulo })
                .Select(g => g.First()); ;

            foreach (var c in query_5)
            {
                Cat_Color.Insert_Color
                (
                    Int32.Parse(Cat_Linea.Get_Linea_Por_Nombre(c.LineaProdArticulo).Rows[0]["Id_Linea"].ToString()),
                    c.ColorArticulo,
                    "000"
                );
            }
            dt_Cat_Color = Cat_Color.Get_Colores().AsEnumerable();

            //Agregamos UM
            var query_6 =
                (from c in _datos
                where !(from o in dt_Cat_UM
                        select o.Field<string>("Nombre"))
                       .Contains(c.UM_Articulo)
                 select c)
                .GroupBy(p => p.UM_Articulo )
                .Select(g => g.First());

            foreach (var c in query_6)
            {
                Cat_UM.Insert_UM(c.UM_Articulo, c.UM_Articulo);
            }

            dt_Cat_UM = Cat_UM.Get_UMes().AsEnumerable();

            //Agregamos Tasas de Impuestos
            var query_7 =
                (from c in _datos
                where !(from o in dt_Cat_TasaImpuesto
                        select o.Field<double>("IVA"))
                       .Contains(c.TasaImpuestoArticulo)
                 select c)
                .GroupBy(p => p.TasaImpuestoArticulo)
                .Select(g => g.First());

            foreach (var c in query_7)
            {
                Cat_TasaImpuesto.Insert_TasaImpuesto
                (
                    "Tasa IVA al " + c.TasaImpuestoArticulo.ToString() + "%",
                    "Tasa IVA al " + c.TasaImpuestoArticulo.ToString() + "%",
                    c.TasaImpuestoArticulo,
                    0,
                    0
                );
            }

            dt_Cat_TasaImpuesto = Cat_TasaImpuesto.Get_TasaImpuestoes().AsEnumerable();

            foreach (CargaDatos_Articulo c in _datos)
            {
                int Aux_Id_GrupoProducutos = Int32.Parse(Cat_Grupo_Productos.Get_Grupo_Productos_Por_Nombre(c.GrupoProdArticulo).Rows[0]["Id_GrupoProductos"].ToString());
                int Aux_Id_Linea = Int32.Parse(Cat_Linea.Get_Linea_Por_Nombre(c.LineaProdArticulo).Rows[0]["Id_Linea"].ToString());

                int Id_Moneda = (from d in dt_Cat_Moneda where d.Field<string>("Clave").Equals(c.MonedaArticulo) select d.Field<int>("Id_Moneda")).First();
               
                Cat_Articulo.Insert_Articulo
                (
                    c.ClaveArticulo,
                    c.NombreArticulo,
                    c.NombreArticulo.Length <= 11 ? c.NombreArticulo : c.NombreArticulo.Substring(0, 11),
                    c.DescripcionArticulo,
                    c.CodigoBarrasArticulo,
                    c.MarcarArticulo,
                    c.ProductoServicio.Equals("Producto") ? 1 : 2,
                    Aux_Id_GrupoProducutos,
                    Int32.Parse(Cat_SubGrupo_Productos.Get_Subgrupo_Productos_Por_Nombre(c.SubGrupoProdArticulo, Aux_Id_GrupoProducutos).Rows[0]["Id_SubgrupoProductos"].ToString()),
                    Aux_Id_Linea,
                    Int32.Parse(Cat_Color.Get_Color_Por_Nombre(c.ColorArticulo, Aux_Id_Linea).Rows[0]["Id_Color"].ToString()),
                    Int32.Parse(Cat_Talla.Get_Talla_Por_Nombre(c.TallaArticulo, Aux_Id_Linea).Rows[0]["Id_Talla"].ToString()),
                    Int32.Parse(Cat_UM.Get_UM_Por_Nombre(c.UM_Articulo).Rows[0]["Id_UM"].ToString()),
                    c.ArticuloDisponibleVenta.Equals("Si") ? true : false,
                    c.ArticuloDescontinuado.Equals("Si") ? true : false,
                    Id_Moneda, 
                    c.PrecioListaArticulo,
                    c.PrecioMinArticulo,
                    Int32.Parse(Cat_TasaImpuesto.Get_TasaImpuesto_Por_IVA(c.TasaImpuestoArticulo).Rows[0]["Id_TasaImpuesto"].ToString()),
                    1,
                    c.CostoEstandarArticulo,
                    c.CostoEstandarArticulo,
                    c.CostoEstandarArticulo,
                    0
                );
            }
            
            MessageBox.Show("Se han cargado exitosamente los datos en el sistema.");
            ((ScrollViewer)this.Parent).Content = new CargaDatos_Main(ref _sesion);
        }

        private void Button_Descartar_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Se ha cancelado la carga del Excel.");
            ((ScrollViewer)this.Parent).Content = new CargaDatos_Main(ref _sesion);
        }
    }    
}
